/**
 * Cesium 相关工具函数
 */
import { v4 as uuidv4 } from 'uuid'

/**
 * 计算两点间距离
 * @param {Object} point1 - 第一个点
 * @param {Object} point2 - 第二个点
 * @returns {number} 距离（米）
 */
export function calculateDistance(point1, point2) {
  const startPoint = Cesium.Cartesian3.fromDegrees(
    point1.longitude, 
    point1.latitude, 
    point1.altitude || 0
  )
  const endPoint = Cesium.Cartesian3.fromDegrees(
    point2.longitude, 
    point2.latitude, 
    point2.altitude || 0
  )
  return Cesium.Cartesian3.distance(startPoint, endPoint)
}

/**
 * 计算航线总距离
 * @param {Array} pointList - 航点列表
 * @returns {number} 总距离（米）
 */
export function calculateTotalDistance(pointList) {
  let totalDistance = 0
  if (pointList.length > 1) {
    for (let i = 0; i < pointList.length - 1; i++) {
      const distance = calculateDistance(pointList[i], pointList[i + 1])
      totalDistance += distance
    }
  }
  return totalDistance
}

/**
 * 生成唯一ID
 * @returns {string} 唯一ID
 */
export function generateId() {
  return uuidv4()
}

/**
 * 创建相机视锥
 * @param {Object} viewer - Cesium viewer
 * @param {Object} observer - 观察者位置
 * @param {Object} target - 目标位置
 * @param {number} fov - 视场角
 * @param {number} aspect - 宽高比
 * @returns {Object} 视锥对象
 */
export function createCameraFrustum(viewer, observer, target, fov = 55, aspect = 1.33) {
  return CameraFrustum.CreateFrustumByTarget(viewer, observer, target, fov, aspect, null, null)
}

/**
 * 设置相机位置
 * @param {Object} viewer - Cesium viewer
 * @param {number} longitude - 经度
 * @param {number} latitude - 纬度
 * @param {number} height - 高度
 */
export function setCameraPosition(viewer, longitude, latitude, height = 10000) {
  viewer.camera.setView({
    destination: Cesium.Cartesian3.fromDegrees(longitude, latitude, height)
  })
}

/**
 * 创建高亮点
 * @param {Object} viewer - Cesium viewer
 * @param {number} longitude - 经度
 * @param {number} latitude - 纬度
 * @param {string} color - 颜色
 * @returns {Object} 实体对象
 */
export function createHighlightPoint(viewer, longitude, latitude, color = 'YELLOW') {
  return viewer.entities.add({
    name: 'hightLight',
    layerId: 'hightLightLayer',
    position: Cesium.Cartesian3.fromDegrees(longitude, latitude),
    point: {
      pixelSize: 8,
      color: Cesium.Color[color],
      outlineColor: Cesium.Color.WHITE,
      outlineWidth: 2
    }
  })
}

/**
 * 移除高亮点
 * @param {Object} viewer - Cesium viewer
 * @param {Object} highlightEntity - 高亮实体
 */
export function removeHighlightPoint(viewer, highlightEntity) {
  if (highlightEntity) {
    viewer.entities.remove(highlightEntity)
  }
}

/**
 * 创建多边形轮廓材质
 * @param {string} color - 颜色
 * @param {number} alpha - 透明度
 * @returns {Object} 材质对象
 */
export function createPolylineMaterial(color = '#00f', alpha = 0.7) {
  return new Cesium.PolylineDashMaterialProperty({
    dashLength: 16,
    color: Cesium.Color.fromCssColorString(color).withAlpha(alpha)
  })
}

/**
 * 创建多边形材质
 * @param {string} color - 颜色
 * @param {number} alpha - 透明度
 * @returns {Object} 材质对象
 */
export function createPolygonMaterial(color = '#ff0', alpha = 0.5) {
  return Cesium.Color.fromCssColorString(color).withAlpha(alpha)
}

/**
 * 创建发光线条材质
 * @param {string} color - 颜色
 * @param {number} alpha - 透明度
 * @param {number} glowPower - 发光强度
 * @returns {Object} 材质对象
 */
export function createGlowMaterial(color = '#00f', alpha = 0.9, glowPower = 0.25) {
  return new Cesium.PolylineGlowMaterialProperty({
    glowPower: glowPower,
    color: Cesium.Color.fromCssColorString(color).withAlpha(alpha)
  })
}

/**
 * 创建标签样式
 * @param {string} text - 文本
 * @param {string} color - 颜色
 * @returns {Object} 标签样式对象
 */
export function createLabelStyle(text, color = 'WHITE') {
  return {
    text: text,
    font: '15pt Helvetica',
    fillColor: Cesium.Color[color],
    outlineColor: Cesium.Color.DARKBLUE,
    outlineWidth: 2,
    style: Cesium.LabelStyle.FILL_AND_OUTLINE,
    verticalOrigin: Cesium.VerticalOrigin.TOP,
    pixelOffset: new Cesium.Cartesian2(-10, 10)
  }
}

/**
 * 创建广告牌样式
 * @param {string} image - 图片路径
 * @param {Object} eyeOffset - 眼偏移
 * @returns {Object} 广告牌样式对象
 */
export function createBillboardStyle(image, eyeOffset = null) {
  const style = {
    image: image
  }
  
  if (eyeOffset) {
    style.eyeOffset = eyeOffset
  }
  
  return style
}
